package com.sky.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.sky.dto.SetmealDTO;
import com.sky.dto.SetmealPageQueryDTO;

import com.sky.entity.*;
import com.sky.exception.DeletionNotAllowedException;
import com.sky.mapper.CategoryMapper;
import com.sky.mapper.DishMapper;
import com.sky.mapper.SetmealDishMapper;
import com.sky.mapper.SetmealMapper;
import com.sky.result.PageResult;
import com.sky.service.SetmealService;

import com.sky.vo.DishItemVO;
import com.sky.vo.SetmealVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;


import java.util.List;

/**
 * CTassName: SetmealServiceImpl
 * Package: com.sky.service.impl
 * Description:
 * 套餐
 */
@Slf4j
@Service
public class SetmealServiceImpl implements SetmealService {

    // 套餐--持久层
    @Autowired
    private SetmealMapper setmealMapper;

    // 套餐，菜品（关联表） --  持久层
    @Autowired
    private SetmealDishMapper setmealDishMapper;



    @Autowired
    private DishMapper dishMapper;

    /**
     * 分页查询
     */
    @Override
    public PageResult page(SetmealPageQueryDTO s) {

        // 设置分页数据
        PageHelper.startPage(s.getPage(), s.getPageSize());

        // 调用持久层--->条件查询
        List<SetmealVO> list = setmealMapper.page(s);

        // 分页结果
        Page<SetmealVO> p = (Page<SetmealVO>) list;


        return new PageResult(p.getTotal(), p.getResult());
    }

    /**
     * 新增套餐
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void save(SetmealDTO setmealDTO) {
        // 拷贝
        Setmeal s = new Setmeal();
        BeanUtils.copyProperties(setmealDTO, s);

        //新增套餐表插入1条数据，获取 insert 语句生成的主键值
        setmealMapper.insert(s);

        //获取insert语句生成的主键值
        Long getId = s.getId();


        log.info("获取insert语句生成的主键值  {}", getId);

        // 添加，套餐菜品
        // 获取，套餐菜品
        List<SetmealDish> flavors = setmealDTO.getSetmealDishes();


        // 判断是否有携带菜品数据
        if (!flavors.isEmpty()) {

            flavors.forEach(f -> f.setSetmealId(getId));

            setmealDishMapper.insertBatch(flavors);

        }


    }

    /**
     * 根据id查询套餐
     */
    @Override
    public SetmealVO getById(Long id) {

        // 根据id查询套餐
        SetmealVO setmealVO = setmealMapper.getById(id);
        log.info("1回显：{}", setmealVO);


        Long getId = setmealVO.getId();
        log.info("2回显：{}", getId);


        List<SetmealDish> list = setmealDishMapper.getId(getId);
        log.info("3回显：{}", list);

        setmealVO.setSetmealDishes(list);


        return setmealVO;
    }

    /**
     * 修改套餐
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void update(SetmealDTO setmealDTO) {

        Setmeal setmeal = new Setmeal();
        BeanUtils.copyProperties(setmealDTO, setmeal);

        // 修改基本信息
        setmealMapper.update(setmeal);

        // 套餐 id
        Long id = setmealDTO.getId();


        log.info("套餐 id：{}", id);

        // 抽取出 ，套餐菜品关系
        List<SetmealDish> setmealDishes = setmealDTO.getSetmealDishes();

        log.info("抽取出 ，套餐菜品关系：{}", setmealDishes);

        // 判断 setmealDishes 是否有携带数据
        if (setmealDishes != null && !setmealDishes.isEmpty()) {
            // 先删除 套餐菜品中间表对应的数据
            setmealDishMapper.delete(id);


            // 在添加
            setmealDishes.forEach(f -> f.setSetmealId(id));
            setmealDishMapper.insertBatch(setmealDishes);
        }


    }


    /**
     * 套餐起售、停售
     */
    @Override
    public void SetmealStartAndStop(Integer status, Long id) {
        Setmeal setmeal = new Setmeal();
        setmeal.setId(id);
        setmeal.setStatus(status);
        log.info("套餐起售、停售，操作数据为：{}",setmeal);
        // 修改基本信息
        setmealMapper.update(setmeal);

    }




    /**
     * 批量删除套餐
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void delete(String id) {

        // 查看套餐是否在启售状态
        log.info("查看套餐是否在启售状态");
        String[] idArray = id.split(",");


        // 遍历菜品，查看没有在启售的菜品
        for (String i : idArray) {

            // 查询对应菜品
            SetmealVO setmealVO = setmealMapper.getById(Long.valueOf(i));
            log.info("查询对应菜品：{}", setmealVO);

            // 判断菜品是否在启售状态
            if (setmealVO.getStatus() > 0) {
                throw new DeletionNotAllowedException("启售中的套餐不能删除");
            }

            // 删除套餐
            log.info("删除套餐");
            setmealMapper.deleteId(Long.valueOf(i));

            // 删除套餐菜品中间对应的数据
            log.info("删除套餐菜品中间对应的数据");
            setmealDishMapper.delete(Long.valueOf(i));


        }


    }


    // pc
    /**
     * 条件查询
     * @param setmeal
     * @return
     */
    public List<Setmeal> list(Setmeal setmeal) {
        List<Setmeal> list = setmealMapper.list(setmeal);
        return list;
    }

    /**
     * 根据id查询菜品选项
     * @param id
     * @return
     */
    public List<DishItemVO> getDishItemById(Long id) {
        return setmealMapper.getDishItemBySetmealId(id);
    }




}
